import { RuleItem } from 'async-validator';
import {
    Aoe,
    FieldName,
    IconType,
    IDisability,
    ISelectable,
    IValues,
    Multiple,
    NamedAoe,
    OptionItem,
    QueryFactor,
    Row,
    SizeType,
    ThemeType,
    UrlStr,
    WidgetType,
    CellType,
    BorderType,
    ShapeType,
    FaceType,
} from './core';

/**
 * # 菜单定义
 */
export interface MenuSchema extends Aoe {
    items: MenuItemSchema[];
    /**
     * 子项缩进效果
     */
    indent?: boolean;
    /**
     * 垂直显示
     */
    vertical?: boolean;
    /**
     * 收缩效果(只显示图标)
     */
    collapse?: boolean;
}

/**
 * ## 菜单项定义
 */
export interface MenuItemSchema extends Aoe {
    /**
     * url or pathinfo
     */
    url?: UrlStr;
    /**
     * 子项
     */
    items?: MenuItemSchema[];
    /**
     * 图标
     */
    icon?: IconType;
    /**
     * 显示一条分割线
     */
    hr?: boolean;
}

/**
 * # 图标定义
 */
export interface IconSchema {
    name: IconType;
}

/**
 * # 按钮定义
 */
export interface ButtonSchema extends Aoe, IDisability {
    /**
     * 图标
     */
    icon?: IconType;
    /**
     * 界面
     */
    theme?: ThemeType;
    /**
     * 边框
     */
    border?: BorderType;
    /**
     * 形状
     */
    shape?: ShapeType;
    /**
     * 外观
     */
    face?: FaceType;
    /**
     * 大小
     */
    size?: SizeType;
    /**
     * 流式
     */
    fluid?: boolean;
}

export interface ToolbarSchema<B extends ButtonSchema = ButtonSchema> extends Aoe {
    items: B[];
    /**
     * ## 参数
     */
    values?: IValues;
    /**
     * ## 通用配置
     */
    common?: Partial<ButtonSchema>;
}

/**
 * # 对话框定义
 */
export interface DialogSchema {
    width?: string;
    height?: string;
    /**
     * 模态
     */
    modal?: boolean;
    label?: string;
}

/**
 * # 图片定义
 */
export type ImageType = { src: string; alt?: string; thumb?: string };

/**
 * # 24列行布局
 */
export interface RowSchema {
    gutter?: number;
}

// noinspection JSUnusedGlobalSymbols
/**
 * ## 列布局
 */
export type ColSchema = {
    [p in SizeType]: number;
};

/**
 * # 视图组件定义
 */
export interface ViewSchema<T extends string = string> {
    /**
     * ## 组件名称
     */
    component: T;
    /**
     * ## 组件参数
     */
    schema?: Aoe;
    /**
     * ## 初始值
     */
    value?: unknown;
    /**
     * ## 跳转
     */
    redirect?: UrlStr;
    /**
     * ## 自定义样式
     */
    className?: string;
    /**
     * ## 标题
     */
    title?: string;
}

/**
 * # 表单域定义
 */
export interface FieldSchema<W = WidgetType>
    extends ISelectable,
        IDisability,
        Multiple,
        FieldProps<W> {
    /**
     * 关联域数据自动填充
     */
    autocomplete?: FieldAutocomplete;
    /**
     * 数组化-已完成-暂时停用
     */
    arrayed?: boolean;
    /**
     * 子表单域-已完成-暂时停用
     */
    fields?: FieldSchema[];
}

// noinspection JSUnusedGlobalSymbols
/**
 * ## Row-Col 布局的表单域
 */
export interface RowedFieldSchema<W = WidgetType> extends FieldSchema<W> {
    /**
     * 栅格布局
     */
    col?: number;
}

/**
 * ## 表单域
 */
export interface FieldProps<W = WidgetType> extends NamedAoe {
    /**
     * 控件名称
     */
    widget?: W;
    /**
     * 校验规则
     */
    rules?: RuleItem[];
    /**
     * 必填
     */
    required?: boolean;
    /**
     * form-item 属性
     */
    itemProps?: FormItemSchema;
}

/**
 * ### 域同步
 */
export type FieldAutocomplete = {
    /**
     * [my_value]: { [field_name: string]: value }
     */
    pairs?: { [me: string]: { [name: string]: unknown } };
    /**
     * field_name: field's value = my value
     */
    sync?: string;
    /**
     * (myValue: string | number) => { [p: string]: value }
     */
    execute?: string;
};

// noinspection JSUnusedGlobalSymbols
/**
 * # 表单定义
 */
export interface FormSchema<F extends FieldSchema = FieldSchema> extends Aoe, FormProps<F> {
    labelWidth?: string;
    labelAlign?: FormLabelAlign;
    modelValue?: IValues;
    /**
     * 布局
     */
    layout?: FormLayout;
    /**
     * 验证
     */
    rules?: FormRules;
    /**
     * 尺寸
     */
    size?: SizeType;
}

/**
 * ## 表单
 *
 * @prop IValues model-value
 */
export interface FormProps<F extends FieldSchema = FieldSchema> {
    /**
     * fields
     */
    elements?: F[];
}

export interface FormItemSchema {
    /**
     * 表单域绑定的域名
     */
    prop?: FieldName;
    /**
     * 标签
     */
    label?: string;
    /**
     * 尺寸
     */
    size?: SizeType;
    /**
     * 必填
     */
    required?: boolean;
    /**
     * 验证
     */
    rules?: RuleItem[];
}

export type FormLabelAlign = 'left' | 'right' | 'top';
export type FormLayout = 'block' | 'inline' | 'special';
export type FormRules = Record<string, RuleItem | RuleItem[]>;

/**
 * ## 表单事件
 *
 * @prop ([values: IValues]) 'update:modelValue'
 */
export interface FormEmits {
    submit: [];
}

/**
 * ## 查询域
 */
export interface QueryField<W = WidgetType> extends FieldSchema<W>, QueryFactor {
    col?:  number;
}

/**
 * # 表格定义
 */
export interface TableSchema extends Aoe {
    /**
     * 列列表
     */
    elements?: ColumnSchema[];
    /**
     * 数据
     */
    data?: Row[];
    /**
     * data-key
     */
    idKey?: string;
    /**
     * 启用复选框
     */
    selector?: boolean;
    /**
     * 全局工具栏
     */
    toolbar?: ToolbarSchema;
    /**
     * 行内工具栏
     */
    operator?: ToolbarSchema;
    /**
     * 大小
     */
    size?: SizeType;
    /**
     * 可缩放
     */
    resizeable?: boolean;
    /**
     * 高度
     */
    height?: string;
    /**
     * 最大高度
     */
    mixHeight?: string;
    /**
     * 条纹
     */
    stripe?: boolean;
}

export interface TableEmits {
    /**
     * 排序事件
     */
    sort: [name: string, direction: 'asc' | 'desc'];
    /**
     * 分页事件
     */
    pagination: [index: number];
}

export interface TableSlots {
    toolbar: () => unknown;
    [name: string]: (
        row: Row,
        rowIndex: number,
        column: ColumnSchema,
        columnIndex: number,
    ) => unknown;
}

export interface ColumnSchema extends NamedAoe {
    /**
     * 关联字段
     */
    name: string;
    /**
     * 列组件名称
     */
    cell?: CellType;
    /**
     * 选项
     */
    options?: OptionItem[];
    /**
     * 提示列
     */
    tip?: string;
    /**
     * 对齐方式
     */
    align?: string;

    width?: string | number;
    minWidth?: string | number;
    mixWidth?: string | number;
    /**
     * 可缩放
     */
    resizeable?: boolean;

    /**
     * 文字折叠
     */
    ellipsis?: boolean;
    /**
     * 可排序
     */
    sortable?: boolean;
}

/**
 * ## 分页
 */
export interface IPagination {
    /**
     * 当前页
     */
    current?: number;
    /**
     * 每页行数
     */
    limit?: number;
    /**
     * 记录总数
     */
    total?: number;
}

// noinspection JSUnusedGlobalSymbols
/**
 * ## 表格远程数据返回格式
 */
export interface ITableResult {
    /**
     * 分页信息
     */
    pagination?: IPagination;
    /**
     * 当前页数据
     */
    rows: Row[];
}

interface TreeCore {
    /**
     * 自定义Key
     */
    keys?: TreeKeys;
    /**
     * 连线样式
     */
    lined?: boolean;
}

/**
 * # 树定义
 */
export interface TreeSchema<T extends Aoe = Aoe> extends TreeCore {
    /**
     * 数据
     */
    data?: TreeNodeSchema<T>[];
}

/**
 * ## 树
 *
 * @prop TreeNodeSchema<T>[] data 通过 defineModel 引入
 */
export interface TreeProps<T extends Aoe = Aoe> extends TreeCore {
    /**
     * 空元素函数
     */
    empty?: () => T;
}

export type TreeNodeSchema<T extends Aoe = Aoe> = T & {
    children?: TreeNodeSchema<T>[];
};

export type TreeKeys = { id?: string; label?: string; children?: string };
